package com.gzsxy.esjy.redis.extend;


import com.gzsxy.esjy.redis.extend.impl.Lock;

import java.util.function.Consumer;
import java.util.function.Function;

/**
 * @param
 * @description: 同步锁
 * @return
 */
public interface RedisLock {

    /**
     * @description: 尝试获取锁
     * @param key          键
     * @param device       没用到
     * @param maxWaitTime  最大的等待时间
     * @param timeInterval 间隔时间
     * @return true  成功， false 失败
     */
    boolean tryLock(String key, String device, long maxWaitTime, long timeInterval);

    /**
     * @description: 尝试获取(多级锁)锁
     * @param keys          键
     * @param device       没用到
     * @param maxWaitTime  最大的等待时间
     * @param timeInterval 间隔时间
     * @return true  成功， false 失败
     */
    boolean tryLock(String[] keys, String device, long maxWaitTime, long timeInterval);

    /**
     * @description: 解除锁
     * @param key      键
     * @return
     */
    void unLock(String key, String device);

    /**
     * @description: 解除锁
     * @param keys      键
     * @return
     */
    void unLock(String[] keys, String device);

    /**
     * @description: 执行锁 = 尝试获取锁+业务操作+解除锁
     * @param lock
     * @param excute
     * @return
     */
    Object excute(Function<Lock,Object> excute, Lock lock);

    /**
     * @description: 执行锁 = 尝试获取锁+业务操作+解除锁
     * @param lock
     * @param excute
     * @return
     */
    void  excute(Lock lock, Consumer<Lock> excute);

    /**
     * @description: 执行锁 = 尝试获取锁+业务操作+解除锁
     * @param locks
     * @param excute
     * @return
     */
    Object excute(Function<Lock[],Object> excute,Lock[] locks);


    /**
     * @description: 执行锁 = 尝试获取锁+业务操作+解除锁
     * @param locks
     * @param excute
     * @return
     */
    void  excute(Lock[] locks, Consumer<Lock[]> excute);

}
